package com.leetcode.sorts.arrays.double_point;

/**
 * @Author: WuPeng
 * @Date: 2021/5/21 10:29 上午
 *
 * 844. 比较含退格的字符串
 *      给定 S 和 T 两个字符串，当它们分别被输入到空白的文本编辑器后，
 *      判断二者是否相等，并返回结果。 # 代表退格字符。
 *      注意：如果对空文本输入退格字符，文本继续为空。
 *
 * 示例 1：
 *      输入：S = "ab#c", T = "ad#c"
 *      输出：true
 *      解释：S 和 T 都会变成 “ac”。
 *
 * 示例 2：
 *      输入：S = "ab##", T = "c#d#"
 *      输出：true
 *      解释：S 和 T 都会变成 “”。
 *
 * 示例 3：
 *      输入：S = "a##c", T = "#a#c"
 *      输出：true
 *      解释：S 和 T 都会变成 “c”。
 *
 * 示例 4：
 *      输入：S = "a#c", T = "b"
 *      输出：false
 *      解释：S 会变成 “c”，但 T 仍然是 “b”。
 *
 */
public class CompareRebackStr_844 {

    /**
     * 解法一：使用栈进行字符串重构，比较重构后的字符串是否相等
     */
    public static boolean solution_01(String s, String t){
        return rebuildStr(s).equals(rebuildStr(t));
    }
    private static String rebuildStr(String str){
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) != '#'){
                sb.append(str.charAt(i));
            }
            else if (sb.length() > 0){
                sb.deleteCharAt(sb.length() - 1);
            }
        }
        return sb.toString();
    }

    /**
     * 解法二：双指针解法
     */
    public static boolean solution_02(String s, String t){
        int s_idx = s.length()-1, t_idx = t.length()-1;
        int count_s = 0, count_t = 0;
        while (s_idx >=0 || t_idx >= 0){

            while (s_idx >= 0){
                if (s.charAt(s_idx) == '#'){
                    count_s++;
                    s_idx--;
                }
                else if (count_s > 0){
                    count_s--;
                    s_idx--;
                }
                else break;
            }

            while (t_idx >= 0){
                if (t.charAt(t_idx) == '#'){
                    count_t++;
                    t_idx--;
                }
                else if (count_t > 0){
                    count_t--;
                    t_idx--;
                }
                else break;
            }

            // 如果s_idx>=0 并且 t_idx>=0,比较两个位置的字符是否相等
            if (s_idx >= 0 && t_idx >= 0){
                if (s.charAt(s_idx) != t.charAt(t_idx)){
                    return false;
                }
            }
            // 如果s_idx 或者 t_idx 其中一个
            else if (s_idx >=0 || t_idx >= 0){
                return false;
            }
        }
        return true;
    }
    public static void main(String[] args) {
        System.out.println(solution_01("ab##", "c#d#"));
        System.out.println(solution_02("a#c", "b"));
    }

}
